package chess.piece;

import javax.swing.ImageIcon;
import java.util.ArrayList;
import chess.Position;
import chess.Status;

/**
 * Classe Pawn (Peão)
 * @author Beatriz Miho Anami
 * @author Lucas Rodrigues Anizelli
 * @author Marcos Okamura Rodrigues
 */
public final class Pawn extends Piece {
	/**
	 * Construtor do peão.
	 * @param id		id do peão
	 * @param position	posição do peão
	 * @param color		cor do peão
	 * @param imageIcon	imageIcon do peão
	 */
	public Pawn(int id, Position position, int color, ImageIcon imageIcon) {
		super(id, position, color, imageIcon);
	}
	
	/**
	 * Retorna a representação do Peão em String.
	 * @return string ""
	 */
	@Override
	public String toString(){
		return "";
	}

	/**
	 * Verifica se o peão pode capturar uma peça na posição especificada.
	 * @param position	posição da peça a ser capturada
	 * @return 			o status da captura
	 */
	public Status canCapture(Position position){
		int columnDistance = Math.abs(this.position.getColumn() - position.getColumn());
		if(columnDistance == 1){
			if(this.color == WHITE){
				if(this.position.getRow() + 1 == position.getRow()){
					return Status.YES;
				}
			} else {
				if(this.position.getRow() - 1 == position.getRow()){
					return Status.YES;
				}		
			}
		}
		return Status.NO;
	}

	/**
	 * Verifica se o peão pode ser movido para a posição especificada.
	 * @param position	nova posição do peão
	 * @return 			o status do movimento
	 */
	public Status canMove(Position position){ 
		if(this.position.getColumn() == position.getColumn()){
			if(this.color == WHITE){
				if(this.position.getRow() == Position.SECOND_WHITE_ROW){
					if(this.position.getRow() + 2 == position.getRow()){
						return Status.CHECK_COLUMN;
					}
				} 
				if(this.position.getRow() + 1 == position.getRow()){
					return Status.YES;
				}
			} else {
				if(this.position.getRow() == Position.SECOND_BLACK_ROW){
					if(this.position.getRow() - 2 == position.getRow()){
						return Status.CHECK_COLUMN;
					}
				} 
				if(this.position.getRow() - 1 == position.getRow()){
					return Status.YES;
				}
			}
		}
		
		int columnDistance = Math.abs(this.position.getColumn() - position.getColumn());
		if(columnDistance == 1){
			if(this.color == WHITE){
				if(this.position.getRow() + 1 == position.getRow()){
					return Status.CHECK_EN_PASSANT;
				}
			} else {
				if(this.position.getRow() - 1 == position.getRow()){
					return Status.CHECK_EN_PASSANT;
				}		
			}
		}
		return Status.NO;
	}

	/**
	 * Retorna o raio de alcance do peão no tabuleiro.
	 * @return	ArrayList com as posições de alcance do peão
	 */
	public ArrayList<Position> getRange(){
		ArrayList<Position> arrayList = new ArrayList<Position>();
		int row = position.getRow();
		int column = position.getColumn();
		if(this.color == WHITE){
			if(row  + 1 < NUMBER_OF_ROWS){
				if(column + 1 < NUMBER_OF_COLUMNS){
					arrayList.add(new Position(row + 1, column + 1));
				}
				if(column - 1 >= 0){
					arrayList.add(new Position(row + 1, column - 1));
				} 
				arrayList.add(new Position(row + 1, column));
				if(row == Position.SECOND_WHITE_ROW){
					arrayList.add(new Position(row + 2, column));
				}
			}
		} else {
			if(row - 1 >= 0){
				if(column + 1 < NUMBER_OF_COLUMNS){
					arrayList.add(new Position(row - 1, column + 1));
				}
				if(column - 1 >= 0){
					arrayList.add(new Position(row - 1, column - 1));
				} 
				arrayList.add(new Position(row - 1, column));
				if(row == Position.SECOND_BLACK_ROW){
					arrayList.add(new Position(row - 2, column));
				}
			}
		}		
		return arrayList;
	}

	/**
	 * Verifica se é possível efetuar captura En Pasant do peão especificado.
	 * @param firstPosition	posição (rodada anterior) do peão a ser capturado
	 * @param lastPosition	posição (atual) do peão a ser capturado
	 * @param nextPosition	posição do peão após a captura
	 * @return 				true se o En Passant pode ser efetuado ou falso contrário
	 */
	public boolean canEnPassant(Position firstPosition, Position lastPosition, Position nextPosition){
		if(Position.isSameColumn(nextPosition, lastPosition) 
			&& Position.isSameRow(position, lastPosition)){
			int rowDistance = Math.abs(firstPosition.getRow() - lastPosition.getRow());
			if(rowDistance == 2){
				return true;
			}
		}
		return false;
	}
	
	/**
	 * Verifica se o peão selecionado pode ser promovido.
	 * @return 	true se o peão pode ser promovido ou false caso contrário 
	 */
	public boolean canPromote(){
		if(this.color == WHITE){
			if(position.getRow() == Position.FIRST_BLACK_ROW){
				return true;
			}
		} else {
			if(position.getRow() == Position.FIRST_WHITE_ROW){
				return true;
			}
		}
		return false;
	}
}
